package com.wlt.controller;

import java.io.File;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.UUID;

import javax.servlet.http.HttpServletRequest;

import org.apache.ibatis.cache.CacheException;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.ui.ModelMap;
import org.springframework.validation.BindingResult;
import org.springframework.validation.ObjectError;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.servlet.ModelAndView;

import com.sun.xml.internal.ws.api.pipe.Fiber;
import com.wlt.controller.validation.ValidGroup1;
import com.wlt.domain.ItemsCustom;
import com.wlt.domain.ItemsQueryVo;
import com.wlt.service.ItemsService;

/**
 * 商品的controller
 * 
 * @author Administrator
 *
 */
@Controller("itemsController")
//为了对url进行分类管理
@RequestMapping("/items")
public class ItemsController {
	@Autowired
	private ItemsService itemsService;

	// 商品分类
	@ModelAttribute("itemtypes")
	public Map<String, String> getItemTypes() {
		Map<String, String> itemTypes = new HashMap<String, String>();
		itemTypes.put("101", "数码");
		itemTypes.put("102", "母婴");
		return itemTypes;
	}

	// 商品列表查询
	/**
	 * 一般建议将URL和方法名写成一样 @RequestMapping("queryItems")实现对queryItems方法和url进行映射一个方法对应一个URL
	 * 相当于这句话<bean name="/queryItems.action" class=
	 * "com.wlt.ssm.controller.ItemsController1"></bean>
	 * 
	 * @return
	 * @throws Exception
	 */
	@RequestMapping("/queryItems")
	public ModelAndView queryItems(HttpServletRequest request, ItemsQueryVo itemsQueryVo) throws Exception {
		// 调用service查找数据库,查询商品列表
		List<ItemsCustom> itemsList = itemsService.findItemsList(null);
		// 返回ModelAndView
		ModelAndView modelAndView = new ModelAndView();
		// 相当于request的setAttribut
		modelAndView.addObject("itemsList", itemsList);

		// 指定视图
		modelAndView.setViewName("/items/itemList");
		return modelAndView;
	}

	// 商品信息修改页面展示@RequestParam("id")
	//@RequestParam(value = "id", required = true) Integer id
	@RequestMapping(value = "/editItems/{id}")
	public String editItems(ModelMap modelMap, @PathVariable("id") Integer id)
			throws Exception {
		System.out.println("修改商品id:" + id);
		// 调用service根据商品id查询商品信息
		ItemsCustom itemsCustom = itemsService.finItemsById(id);
		// 判断商品是否为空,根据id没有查询到商品,抛出异常,提示用户商品信息不存在
		if (itemsCustom == null) {
			throw new CacheException("修改的商品信息不存在!");
		}
		// 将商品信息放到model
		modelMap.addAttribute("itemsCustom", itemsCustom);
		// 指定视图

		return "/items/editItems";
	}
	//查询商品信息,输出json
	/**
	 *   @PathVariable 
	 * @param id
	 * @return
	 * @throws Exception
	 * 
	 * @RequestMapping("/itemsView/{id}")里面的id:
	 * 表示将这个位置的参数传到@PathVariable("id")指定的名称里面
	 */
	@RequestMapping("/itemsView/{id}")
	public @ResponseBody ItemsCustom itemsView(@PathVariable("id") Integer id) throws Exception{
		
		//调用service查询商品信息
		ItemsCustom itemsCustom = itemsService.finItemsById(id);
		
		return itemsCustom;
	}
	// 商品信息修改提交
	/*
	 * 在需要校验的pojo前边添加注解@Validated, 在需要校验的pojo后边添加 BindingResult
	 * bindingResult接受校验出错的信息 注意:@Validated和 BindingResult
	 * bindingResult是配对出现的,并且形参顺序是固定的 value = {ValidGroup1.class}
	 * 指定使用ValidGroup1分组校验
	 * 
	 * public String editItemsSubmit(Model model,HttpServletRequest request,Integer
	 * id,@ModelAttribute("items") @Validated(value = {ValidGroup1.class} )
	 * ItemsCustom itemsCustom,BindingResult bindingResult) throws Exception {}
	 * 
	 * @ModelAttribute("items") 可以指定pojo回显到页面在request中的key
	 */
	@RequestMapping("/editItemsSubmit")
	public String editItemsSubmit(Model model, HttpServletRequest request, Integer id,
			@Validated(value = { ValidGroup1.class }) ItemsCustom itemsCustom, BindingResult bindingResult,
			MultipartFile items_pic//接收商品图片
			) throws Exception {
		// 获取校验信息
		if (bindingResult.hasErrors()) {
			// 输出错误信息
			List<ObjectError> allErrors = bindingResult.getAllErrors();
			for (ObjectError objectError : allErrors) {
				// 输出错误信息
				System.out.println(objectError.getDefaultMessage());
			}
			// 将错误信息展示到页面
			model.addAttribute("allErrors", allErrors);
			// 出错重新到商品的修改页面
			return "/items/editItems";
		}
		//图片的原始名称
		String originalFilename =items_pic.getOriginalFilename();;
		//上传图片
		if(items_pic != null && originalFilename != null && originalFilename.length()>0) {
			//存储图片的物理路径
			String pic_path="F:\\testGit\\images";
			//新的图片名称
			String newFileName=UUID.randomUUID()+originalFilename.substring(originalFilename.lastIndexOf("."));
			//新图片
			File newFile=new File(pic_path+newFileName);
			//将内存中的数据写入磁盘
			items_pic.transferTo(newFile);
			
			//将新图片名称写到itemsCustom中
			itemsCustom.setPic(newFileName);
		}
		// 调用service更新商品信息 ,页面需要将商品信息传到此方法
		itemsService.updateItems(id, itemsCustom);
		// 指定视图
		return "forword:queryItems.do";
	}

	// 批量删除商品信息
	@RequestMapping("/deleteItems")
	public String deleteItems(Integer[] items_id) throws Exception {

		// 调用service批量删除商品
		System.out.println(items_id);

		return "/success";

	}

	// 批量修改商品页面,将商品信息查询出来,在页面中可以编辑商品信息
	@RequestMapping("/editItemsQuery")
	public ModelAndView editItemsQuery(HttpServletRequest request, ItemsQueryVo itemsQueryVo) throws Exception {

		// 调用service 查找数据库,查询商品列表
		List<ItemsCustom> itemsList = itemsService.findItemsList(itemsQueryVo);

		// 返回ModelAndView
		ModelAndView modelAndView = new ModelAndView();
		// 相当于request.setAttibut,在jsp页面中通过itemsList取数据
		modelAndView.addObject("itemsList", itemsList);
		// 指定视图

		modelAndView.setViewName("/items/editItemsQuery");
		return modelAndView;
	}

	// 批量提交
	@RequestMapping("/editItemsAllSubmit")
	// 通过ItemsQueryVo接受批量提交的商品信息,将商品信息存储到itemsQueryVo中的itemsList属性中.
	public String editItemsAllSubmit(ItemsQueryVo itemsQueryVo) throws Exception {

		// 返回的是页面
		return "/success";
	}
}
